package pe.com.cotelasa.scp.controlador;

import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.AjaxBehaviorEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.util.StringUtils;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.dominio.common.helper.SelectOneMenuHelper;
import pe.com.cotelasa.scp.controlador.backingBean.BKCliente;
import pe.com.cotelasa.scp.controlador.backingBean.BKComponenteLocal;
import pe.com.cotelasa.scp.controlador.backingBean.BKContacto;
import pe.com.cotelasa.scp.controlador.backingBean.BKUbigeo;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.service.IServicioCliente;
import pe.com.cotelasa.scp.dominio.service.IServicioUbigeo;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioArchivos;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioCadenas;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioParametro;
import pe.com.cotelasa.scp.dominio.service.IServicioSede;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoContacto;
import pe.com.cotelasa.scp.entidad.Cliente;
import pe.com.cotelasa.scp.entidad.Contacto;
import pe.com.cotelasa.scp.entidad.Pais;
import pe.com.cotelasa.scp.entidad.ParametroDetalle;
import pe.com.cotelasa.scp.entidad.Sede;
import pe.com.cotelasa.scp.entidad.Ubigeo;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

@Named(value = "MBCliente")
@Scope("request")
public class MBCliente extends MBGenerico implements IMantenedor, IObserver, Serializable {

    private static final long serialVersionUID = 5948955445845016174L;
    private static Logger logger = Logger.getLogger(MBCliente.class);
    @Inject
    private BKCliente bkCliente;
    @Inject
    private BKComponenteLocal bkLocal;
    @Inject
    private BKContacto bkContacto;
    @Inject
    private IServicioCliente servicioCliente;
    @Inject
    private IServicioUbigeo servicioUbigeo;
    @Inject
    private IServicioSede servicioLocal;
    @Inject
    private IServicioParametro servicioParametro;
    @Inject
    private IServicioTipoContacto servicioTipoContacto;
    @Inject
    private MBUbigeo mbUbigeo;
    @Inject
    private BKUbigeo bkUbigeo;
    private String URL;
    @Autowired
    BKSession session;

    public MBCliente() {
    }

    public String mostrarMantenimiento() {
        //new BKContacto();

        bkCliente.setListaClientesActivos(null);

        bkCliente.setClienteBusqueda(new Cliente());
        bkCliente.getClienteBusqueda().setNumeroDocumento("");
        bkCliente.getClienteBusqueda().setNombreComercial("");
        bkCliente.getClienteBusqueda().setRazonSocial("");
        bkCliente.getClienteBusqueda().setTipoCliente('0');
        return URLPaginacion.Cliente.URL_LISTA_CLIENTE;
    }

    public void resetearValores() {
        bkContacto.setEstaTipoComtacto(true);
        bkUbigeo.inicializarValores(null, null, false, null);
        bkContacto.setListaContacto(new ArrayList<Contacto>());
        bkContacto.setListaContactoEditar(new ArrayList<Contacto>());
        bkLocal.setListaLocal(new ArrayList<Sede>());
        bkLocal.setListaLocalEditar(new ArrayList<Sede>());
        bkCliente.setSedeAdminstradora(null);
    }

    public void buscarListaClientes() {
        try {
            bkCliente.setListaClientesActivos(this.servicioCliente.listarClientesPorFiltro(bkCliente.getClienteBusqueda()));

            for (Cliente cli : bkCliente.getListaClientesActivos()) {
                System.out.println("El tipo de cliente es:" + cli.getTipoCliente());
            }


        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            System.err.println(e);
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }
    }

    @Override
    public String nuevo() {
        this.bkCliente.setComando(new ComandoGuardar(this));
        mbUbigeo.addObserver(this);
        resetearValores();
        bkCliente.setDocumento(null);
        bkCliente.setVerFormulario(false);
        bkCliente.setClienteModificar(new Cliente());
        bkCliente.setClienteFormulario(new Cliente());

        cargarValoresIniciales();
        bkCliente.getClienteFormulario().setTipoEntidad("J");

        return URLPaginacion.Cliente.URL_FORMULARIO_CLIENTE;
    }

    @Override
    public String editar() {
        this.bkCliente.setComando(new ComandoActualizar(this));
        mbUbigeo.addObserver(this);
        resetearValores();
        bkCliente.setVerFormulario(false);
        bkCliente.setDocumento(null);
        try {
            Cliente cliente = servicioCliente.conseguirClienteConUbigeo(bkCliente.getClienteFormulario().getId());
            bkCliente.setClienteModificar(cliente);
            cargarValoresIniciales();

            bkUbigeo.inicializarValores(cliente.getIdUbigeo().getIdPais(), cliente.getIdUbigeo(), false, cliente.getDescUbicacion());


            for (Sede local : cliente.getSedeCollection()) {
                if (local.getSedeAdministradora() == 1) {
                    bkCliente.setSedeAdminstradora(local);
                } else {
                    if (local.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                        bkLocal.getListaLocal().add(local);
                    }
                    bkLocal.getListaLocalEditar().add(local);
                }
            }
            if (!bkCliente.getSedeAdminstradora().getContactoCollection().isEmpty() || bkCliente.getSedeAdminstradora().getContactoCollection() != null) {
                bkContacto.setListaContactoEditar((List<Contacto>) bkCliente.getSedeAdminstradora().getContactoCollection());

                for (Contacto contacto : bkContacto.getListaContactoEditar()) {
                    if (contacto.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                        bkContacto.getListaContacto().add(contacto);
                    }
                }
            }
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            System.err.println(e);
            e.printStackTrace();
            logger.error(e.getMessage(), e);
        }

        return URLPaginacion.Cliente.URL_FORMULARIO_CLIENTE;

    }

    @Override
    public String guardar() {
        Cliente cliente = bkCliente.getClienteFormulario();
        try {
            if (!validarRuc(cliente.getNumeroDocumento())) {
                mostrarError("El RUC ya ha sido registrado en otro cliente");
                URL = URLPaginacion.Cliente.URL_FORMULARIO_CLIENTE;
            } else if (!validarRazonSocial(cliente.getRazonSocial())) {
                mostrarError("La RAZON SOCIAL ya ha sido registrada en otro cliente");
                URL = URLPaginacion.Cliente.URL_FORMULARIO_CLIENTE;
            } else if (!validarCodigo(cliente.getCodigoCliente())) {
                mostrarError("El Codigo ya ha sido registrado en otro Cliente");
                URL = URLPaginacion.Cliente.URL_FORMULARIO_CLIENTE;
            } else {

                if (bkCliente.getDocumento() != null) {
                    String[] imagen = StringUtils.split(bkCliente.getDocumento().getFileName(), ".");
                    cliente.setDocumento(cliente.getNumeroDocumento() + "." + imagen[imagen.length - 1]);
                }

                cliente.setUsrCreacion(session.getUsuario().getUsuario());
                cliente.setFecCreacion(new Date());

                Sede sedeAdmin = new Sede();
                sedeAdmin = inicializarSedeAdmin(cliente, sedeAdmin);

                for (Contacto contacto : bkContacto.getListaContacto()) {
                    contacto.setIdSede(sedeAdmin);
                }

                sedeAdmin.setContactoCollection(bkContacto.getListaContacto());




                sedeAdmin.setIdUbigeo(cliente.getIdUbigeo());
                bkLocal.getListaLocal().add(sedeAdmin);

                for (Sede local : bkLocal.getListaLocal()) {

                    local.setIdCliente(cliente);

                    //servicioLocal.guardarSede(local);
                }
                cliente.setSedeCollection(bkLocal.getListaLocal());

                cliente.setRazonSocial(UtilitarioCadenas.convertirUTF8(cliente.getRazonSocial()));
                cliente.setNombreComercial(UtilitarioCadenas.convertirUTF8(cliente.getNombreComercial()));
                cliente.setDescUbicacion(UtilitarioCadenas.convertirUTF8(cliente.getDescUbicacion()));
                cliente.setDireccionLegal(UtilitarioCadenas.convertirUTF8(cliente.getDireccionLegal()));

                servicioCliente.guardarCliente(cliente);

                if (bkCliente.getDocumento() != null) {
                    guardarArchivoServer(bkCliente.getDocumento(), serviceProperties.getProperty("path.server.documento.cliente")
                            + cliente.getDocumento());
                }


                buscarListaClientes();
                URL = editar();
                //URL = mostrarMantenimiento();
                mostrarMensaje("Se guardo los datos del cliente satisfactoriamente.");
            }
        } catch (Exception e) {
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            System.err.println(e);
            e.printStackTrace();
            URL = URLPaginacion.Cliente.URL_FORMULARIO_CLIENTE;
            logger.error(e.getMessage(), e);
        }
        return URL;
    }

    @Override
    public String actualizar() {
        try {
            Cliente cliente = bkCliente.getClienteFormulario();

            if (!validarRuc(cliente.getNumeroDocumento())) {
                mostrarError("El RUC ya ha sido registrado en otro cliente");
                URL = URLPaginacion.Cliente.URL_FORMULARIO_CLIENTE;
            } else if (!validarRazonSocial(cliente.getRazonSocial())) {
                mostrarError("La RAZON SOCIAL ya ha sido registrada en otro cliente");
                URL = URLPaginacion.Cliente.URL_FORMULARIO_CLIENTE;
            } else if (!validarCodigo(cliente.getCodigoCliente())) {
                mostrarError("El Codigo ya ha sido registrado en otro Cliente");
                URL = URLPaginacion.Cliente.URL_FORMULARIO_CLIENTE;
            } else {
                System.out.println(">>>>>>>>>>>>>>> " + bkCliente.getDocumento());
                if (bkCliente.getDocumento() != null) {
                    String[] imagen = StringUtils.split(bkCliente.getDocumento().getFileName(), ".");
                    cliente.setDocumento(cliente.getNumeroDocumento() + "." + imagen[imagen.length - 1]);
                }

                cliente.setUsrModificacion(session.getUsuario().getUsuario());
                cliente.setFecModificacion(new Date());
                cliente.setRazonSocial(UtilitarioCadenas.convertirUTF8(cliente.getRazonSocial()));
                cliente.setNombreComercial(UtilitarioCadenas.convertirUTF8(cliente.getNombreComercial()));
                cliente.setDescUbicacion(UtilitarioCadenas.convertirUTF8(cliente.getDescUbicacion()));
                cliente.setDireccionLegal(UtilitarioCadenas.convertirUTF8(cliente.getDireccionLegal()));

                bkCliente.getSedeAdminstradora().setDescUbicacion(cliente.getDescUbicacion());
                bkCliente.getSedeAdminstradora().setDireccion(cliente.getDireccionLegal());
                bkCliente.getSedeAdminstradora().setFecModificacion(new Date());
                bkCliente.getSedeAdminstradora().setUsrModificacion("Jesus");

                for (Contacto contacto : bkContacto.getListaContactoEditar()) {
                    if (contacto.getId() == null) {
                        contacto.setIdSede(bkCliente.getSedeAdminstradora());
                    }
                }

                bkCliente.getSedeAdminstradora().setContactoCollection(bkContacto.getListaContactoEditar());

                bkCliente.getSedeAdminstradora().setIdUbigeo(cliente.getIdUbigeo());
                bkLocal.getListaLocalEditar().add(bkCliente.getSedeAdminstradora());

                for (Sede local : bkLocal.getListaLocalEditar()) {
                    if (local.getId() == null) {
                        local.setIdCliente(cliente);
                        //servicioLocal.guardarSede(local);

                    } else {
                        //servicioLocal.actualizarSede(local);
                    }

                }

                if (bkCliente.getDocumento() != null) {
                    guardarArchivoServer(bkCliente.getDocumento(), serviceProperties.getProperty("path.server.documento.cliente")
                            + cliente.getDocumento());
                }
                cliente.setSedeCollection(bkLocal.getListaLocalEditar());

                servicioCliente.actualizarCliente(cliente);
                if (bkCliente.getDocumento() != null) {
                    guardarArchivoServer(bkCliente.getDocumento(), serviceProperties.getProperty("path.server.documento.cliente")
                            + cliente.getDocumento());
                }
                mostrarMensaje("Se actualizo los datos de la cliente satisfactoriamente.");

                buscarListaClientes();
                URL = editar();
                //URL = mostrarMantenimiento();
            }
        } catch (Exception e) {
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            System.err.println(e);
            e.printStackTrace();
            logger.error(e.getMessage(), e);
        }

        return URL;
    }

    @Override
    public void eliminar(ActionEvent actionEvent) {
        Cliente cliente = bkCliente.getClienteSeleccionado();

        cliente.setUsrModificacion(session.getUsuario().getUsuario());
        cliente.setFecModificacion(new Date());
        //logger.info("Eliminar cliente : " + bkCliente.getClienteSeleccionado());
        try {
            servicioCliente.eliminarCliente(cliente);
            bkCliente.setListaClientesActivos(this.servicioCliente.listarClientesPorFiltro(bkCliente.getClienteBusqueda()));
            mostrarMensaje("Se elimino el articulo satisfactoriamente");
        } catch (ServiceException ex) {
            ex.printStackTrace();
            logger.error(ex.getMessage(), ex);
            mostrarError("Ocurrio un problema al elminar el cliente");
        }
    }

    @Override
    public String ver() {
        editar();
        bkCliente.setVerFormulario(true);
        return URLPaginacion.Cliente.URL_VER_CLIENTE;
    }

    @Override
    public String aceptar() {

        return URLPaginacion.Cliente.URL_LISTA_CLIENTE;
    }

    private void cargarCombo() {
        try {
            logger.info("1");
            bkCliente.setListaPais(SelectOneMenuHelper.listaPaises((List<Pais>) servicioUbigeo.listarTodosPaises()));
            logger.info("2");
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }

    public boolean validarRuc(String ruc) {
        try {
            System.out.println("ruc nuevo = " + ruc);
            System.out.println("ruc modificar = " + bkCliente.getClienteModificar().getNumeroDocumento());
            if (ruc.equals(bkCliente.getClienteModificar().getNumeroDocumento())) {
                return true;
            } else {
                return servicioCliente.validarRuc(ruc);
            }
        } catch (ServiceException e) {
            return false;
        }

    }

    public boolean validarRazonSocial(String razonSocial) {
        try {
            if (razonSocial.equals(bkCliente.getClienteModificar().getRazonSocial())) {
                return true;
            } else {
                return servicioCliente.validarRazonSocial(razonSocial);
            }
        } catch (ServiceException e) {
            return false;
        }

    }

    public boolean validarCodigo(String codigo) {
        try {
            if (codigo.equals(bkCliente.getClienteModificar().getCodigoCliente())) {
                return true;
            } else {
                return servicioCliente.validarCodigo(codigo);
            }
        } catch (ServiceException e) {
            return false;
        }

    }

    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String cancelar() {
        return URLPaginacion.Cliente.URL_LISTA_CLIENTE;
        //return mostrarMantenimiento();
    }

    public void cambiarTipoCliente(AjaxBehaviorEvent event) {
        logger.info("cambiarTipoProveedor : " + event);
        if (bkCliente.getClienteFormulario().getTipoEntidad().equalsIgnoreCase("N")) {
            bkCliente.setTipoJuridico(true);
        } else {
            bkCliente.setTipoJuridico(false);
        }
    }

    private void cargarValoresIniciales() {
        try {
            bkContacto.setListaTipoContacto(servicioTipoContacto.listarTipoContactosActivos());
            bkCliente.setListaTipoCliente(SelectOneMenuHelper.listaTipoCliente((List<ParametroDetalle>) servicioParametro.listarTiposProveedoresActivos()));
        } catch (ServiceException e) {
            e.printStackTrace();
        }
    }

    public Sede inicializarSedeAdmin(Cliente cliente, Sede sede) {

        sede.setDescUbicacion(cliente.getDescUbicacion());
        sede.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
        sede.setUsrCreacion(session.getUsuario().getUsuario());
        sede.setFecCreacion(new Date());
        sede.setSedeAdministradora(1);
        sede.setEsAlmacen((short) 1);
        sede.setEsTienda((short) 0);
        sede.setNombre("PRINCIPAL");
        sede.setNroSecGuiaRemision(0);
        sede.setNroSecFactura(0);
        sede.setDireccion(cliente.getDireccionLegal());

        return sede;
    }

    @Override
    public void actualizarObservador(Object object) {
        Map<String, Object> datos = (Map<String, Object>) object;
        bkCliente.getClienteFormulario().setDescUbicacion((String) datos.get("descripcionUbigeo"));
        bkCliente.getClienteFormulario().setIdUbigeo((Ubigeo) datos.get("ubigeo"));
    }

    /**
     * ************** Administrar archivos *****
     */
    private boolean guardarArchivoServer(UploadedFile fileLogo, String documento) throws ServiceException {
        try {
            File archivoLogo = new File(documento);
            if (archivoLogo != null) {
                if (archivoLogo.exists()) {
                    UtilitarioArchivos.delete(archivoLogo);
                }
            }
            System.out.println("Logo " + documento);
            System.out.println("Archivo Logo " + archivoLogo);
            System.out.println("FileLogo " + fileLogo);
            System.out.println("Flujo " + fileLogo.getInputstream());
            UtilitarioArchivos.copyInputStream(fileLogo.getInputstream(), archivoLogo);
            return true;
        } catch (IOException e) {
            throw new ServiceException(e);
        }

    }

    public void handleFileUpload(FileUploadEvent event) {
        bkCliente.setDocumento(event.getFile());
        FacesMessage msg = new FacesMessage("Se subió ", event.getFile().getFileName());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }
}
